﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Model.Contratos;
using Model.Tipologias;
using Model.Clientes;

namespace welwitschia.Contratos
{
    public partial class ContratoRefeicaoDetalhe : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                IContratoService contratoService = new ContratoService();
                Contrato contrato = null;
                if (!String.IsNullOrEmpty(Request.QueryString["nc"]))
                {
                    contrato = contratoService.ObterPorNumeroContrato(Convert.ToInt64(Request.QueryString["nc"]));
                    ModelParaView(contrato);
                }
                else if (!String.IsNullOrEmpty(Request.QueryString["rcid"]))
                {
                    RefeicaoContrato refeicaoContrato
                        = contratoService.ObterRefeicaoPorIdRefeicaoContratada(Convert.ToInt64(Request.QueryString["rcid"]));

                    ModelParaView(refeicaoContrato);
                }
                else
                {
                    throw new Exception("Parâmetro inválido!");
                }
            }
        }

        #region Eventos de ecrã

        protected void lvOpcoes_ItemDeleting(object sender, ListViewDeleteEventArgs e)
        {
        }

        protected void lvOpcoes_ItemEditing(object sender, ListViewEditEventArgs e)
        {
        }

        protected void lvOpcoes_ItemCommand(object sender, ListViewCommandEventArgs e)
        {

            if (e.CommandName == "Edit")
            {
                Response.Redirect(String.Format(@"~\Contratos\ContratoRefeicaoOpcaoDetalhe.aspx?rcid={0}&opc={1}",
                     e.CommandArgument.ToString().Split(';')[0], e.CommandArgument.ToString().Split(';')[1]));
            }
            else if (e.CommandName == "Delete")
            {
                IContratoService contratoService = new ContratoService();
                OpcaoRefeicaoContrato opcaoRefeicaoContrato = new OpcaoRefeicaoContrato();
                opcaoRefeicaoContrato.RefeicaoContratada = new RefeicaoContrato()
                {
                    IdRefeicaoContratada =
                        Convert.ToInt64(e.CommandArgument.ToString().Split(';')[0])
                };
                opcaoRefeicaoContrato.TipoOpcao = new Tipologia()
                {
                    Codigo =
                        e.CommandArgument.ToString().Split(';')[1]
                };

                contratoService.Apaga(opcaoRefeicaoContrato);
            }
        }

        protected void lvPrecos_ItemDeleting(object sender, ListViewDeleteEventArgs e)
        {
        }

        protected void lvPrecos_ItemEditing(object sender, ListViewEditEventArgs e)
        {
        }

        protected void lvPrecos_ItemCommand(object sender, ListViewCommandEventArgs e)
        {

            if (e.CommandName == "Edit")
            {
                Response.Redirect(String.Format(@"~\Contratos\ContratoRefeicaoPrecoDetalhe.aspx?rcid={0}&tsc={1}",
                     e.CommandArgument.ToString().Split(';')[0], e.CommandArgument.ToString().Split(';')[1]));
            }
            else if (e.CommandName == "Delete")
            {
                IContratoService contratoService = new ContratoService();
                PrecoRefeicaoContrato precoRefeicaoContrato = new PrecoRefeicaoContrato();
                precoRefeicaoContrato.RefeicaoContratada = new RefeicaoContrato()
                {
                    IdRefeicaoContratada =
                        Convert.ToInt64(e.CommandArgument.ToString().Split(';')[0])
                };
                precoRefeicaoContrato.TipoServico = new Tipologia()
                {
                    Codigo =
                        e.CommandArgument.ToString().Split(';')[1]
                };

                contratoService.Apaga(precoRefeicaoContrato);
            }
        }
        
        
        protected void btnGravar_Click(object sender, EventArgs e)
        {
            IContratoService contratoService = new ContratoService();
            RefeicaoContrato refeicaoContrato = ViewParaModel(new RefeicaoContrato());
            if (String.IsNullOrEmpty(hfIdRefeicaoContratada.Value))
            {
                refeicaoContrato = contratoService.Insere(refeicaoContrato);
                hfIdRefeicaoContratada.Value = refeicaoContrato.IdRefeicaoContratada.ToString();

                IList<UnidadeRefeicaoContrato> lurc =
                    contratoService.ObterUnidadesRefeicaoContratoPorRefeicaoContratada(refeicaoContrato.IdRefeicaoContratada);

                foreach (UnidadeRefeicaoContrato urc in lurc)
                {
                    contratoService.Insere(urc);
                }
                
                lvUnidades.DataSource = contratoService.ObterUnidadesRefeicaoContratoPorRefeicaoContratada(refeicaoContrato.IdRefeicaoContratada);
                lvUnidades.DataBind();
            }
            else
            {
                contratoService.Actualiza(refeicaoContrato);

                UnidadeRefeicaoContrato urc = null;
                            
                for (Int32 i = 0; i < lvUnidades.Items.Count; i++)
                {
                    urc = new UnidadeRefeicaoContrato();
                    urc.ClasseRefeicao = refeicaoContrato.TipoClasseRefeicao;
                    urc.RefeicaoContrato = refeicaoContrato;
                    urc.TipoRefeicao = refeicaoContrato.TipoRefeicao;
                    HiddenField hfIdUnidade = (HiddenField)lvUnidades.Items[i].Controls[1].Controls[2].FindControl("hfIdUnidade");
                    urc.Unidade = new Unidade()
                    {
                        IdUnidade = Convert.ToInt64(hfIdUnidade.Value)
                    };

                    CheckBox chkActiva = (CheckBox)lvUnidades.Items[i].Controls[1].Controls[2].FindControl("chkServicoActivo");
                    DropDownList ddlServico = (DropDownList)lvUnidades.Items[i].Controls[1].Controls[2].FindControl("ddlTipoServico");
                    HiddenField hfActivaEstadoOriginal = (HiddenField)lvUnidades.Items[i].Controls[1].Controls[2].FindControl("hfActivaEstadoOriginal");

                    if (chkActiva.Checked)
                    {
                        if (ddlServico.SelectedIndex == 0)
                        {
                            throw new Exception("Deve indicar o tipo de serviço para todas as unidades que servem esta refeição.");
                        }
                        else
                        {
                            urc.TipoServico = new Tipologia() { Codigo = ddlServico.SelectedValue };
                           
                            if (Convert.ToBoolean(hfActivaEstadoOriginal.Value))
                                contratoService.Actualiza(urc);
                            else
                                contratoService.Insere(urc);
                        }
                    }
                    else
                    {
                        if (Convert.ToBoolean(hfActivaEstadoOriginal.Value))
                            contratoService.Apaga(urc);
                    }
                }


            }
            
        }

        protected void btnAdOpcao_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~\Contratos\ContratoRefeicaoOpcaoDetalhe.aspx?rcid=" + hfIdRefeicaoContratada.Value);
        }

        protected void btnAdPreco_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~\Contratos\ContratoRefeicaoPrecoDetalhe.aspx?rcid=" + hfIdRefeicaoContratada.Value);
        }

        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~\Contratos\ContratoDetalhe.aspx?nc=" + txtNumeroContrato.Text);
        }
        
        #endregion

        #region Eventos ListView lvUnidades

        protected void lvUnidades_ItemDeleting(object sender, ListViewDeleteEventArgs e)
        {
        }

        protected void lvUnidades_ItemEditing(object sender, ListViewEditEventArgs e)
        {
        }

        protected void lvUnidades_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
        }

        protected void lvUnidades_ItemCreated(object sender, ListViewItemEventArgs e)
        {
            if (e.Item.ItemType == ListViewItemType.DataItem)
            {
                if (e.Item.DataItem != null)
                {
                    IContratoService contratoService = new ContratoService();
                    IList<PrecoRefeicaoContrato> lPreco = contratoService.ObterTodosPrecoPorRefeicaoContratada(
                                                ((UnidadeRefeicaoContrato)e.Item.DataItem).RefeicaoContrato.IdRefeicaoContratada);
                    DropDownList ddl = (DropDownList)e.Item.FindControl("ddlTipoServico");

                    if (ddl != null)
                    {
                        ddl.DataSource = from a in lPreco
                                         select new { Descricao = a.TipoServico.Descricao, Codigo = a.TipoServico.Codigo };

                        ddl.DataTextField = "Descricao";
                        ddl.DataValueField = "Codigo";
                        ddl.DataBind();

                    }
                }

            }
        }

        protected void lvUnidades_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            DropDownList ddl = (DropDownList)e.Item.FindControl("ddlTipoServico");
            HiddenField hf = (HiddenField)e.Item.FindControl("hfCodTipoServico");
            ddl.Items.Insert(0, new ListItem() { Text = "", Value = "-1000" });
            ddl.SelectedValue = hf.Value;

        }

        protected void lvUnidades_DataBinding(object sender, EventArgs e)
        {

        }
        #endregion

        #region Metodos de Apoio
        
        private void ModelParaView(RefeicaoContrato refeicaoContrato)
        {
            ModelParaView(refeicaoContrato.Contrato);
            ddlTipoRefeicao.SelectedValue = refeicaoContrato.TipoRefeicao.Codigo;
            if(refeicaoContrato.TipoClasseRefeicao != null)
                ddlClasseRefeicao.SelectedValue = refeicaoContrato.TipoClasseRefeicao.Codigo;
            hfIdRefeicaoContratada.Value = refeicaoContrato.IdRefeicaoContratada.ToString();
            
            IContratoService contratoService = new ContratoService();
            lvOpcoes.DataSource = contratoService.ObterTodosOpcaoPorRefeicaoContratada(refeicaoContrato.IdRefeicaoContratada);
            lvOpcoes.DataBind();

            lvPrecos.DataSource = contratoService.ObterTodosPrecoPorRefeicaoContratada(refeicaoContrato.IdRefeicaoContratada);
            lvPrecos.DataBind();

            lvUnidades.DataSource = contratoService.ObterUnidadesRefeicaoContratoPorRefeicaoContratada(refeicaoContrato.IdRefeicaoContratada);
            lvUnidades.DataBind();

           
        }

        private void ModelParaView(Contrato contrato)
        {
            ITipologiaService tipologiaService = new TipologiaService();

            ddlTipoRefeicao.DataSource = tipologiaService.ObterPorTipo("TipoRefeicao");
            ddlTipoRefeicao.DataTextField = "Descricao";
            ddlTipoRefeicao.DataValueField = "Codigo";
            ddlTipoRefeicao.DataBind();
            ddlTipoRefeicao.Items.Insert(0, new ListItem() { Text = String.Empty, Value = "-1000" });
            
            ddlClasseRefeicao.DataSource = tipologiaService.ObterPorTipo("ClasseRefeicao");
            ddlClasseRefeicao.DataTextField = "Descricao";
            ddlClasseRefeicao.DataValueField = "Codigo";
            ddlClasseRefeicao.DataBind();
            ddlClasseRefeicao.Items.Insert(0, new ListItem() { Text = String.Empty, Value = "-1000" });
                     
            txtNumeroContrato.Text = contrato.NumeroContrato.ToString();
            txtDataContrato.Text = contrato.DataContrato.ToString();
            txtIdCliente.Text = contrato.Cliente.IdCliente.ToString();
            txtNomeCliente.Text = contrato.Cliente.Nome;
            txtIdUnidade.Text = contrato.Unidade.IdUnidade.ToString();
            txtDesignacao.Text = contrato.Unidade.Designacao;
            hfIdRefeicaoContratada.Value = String.Empty;
        }

        private RefeicaoContrato ViewParaModel(RefeicaoContrato refeicaoContrato)
        {
            refeicaoContrato.Contrato = new Contrato() { NumeroContrato = Convert.ToInt64(txtNumeroContrato.Text) };
            refeicaoContrato.TipoClasseRefeicao = new Tipologia() { Tipo = "ClasseRefeicao", Codigo = ddlClasseRefeicao.SelectedValue };
            refeicaoContrato.TipoRefeicao = new Tipologia() { Tipo = "ClasseRefeicao", Codigo = ddlTipoRefeicao.SelectedValue };
            if(!String.IsNullOrEmpty(hfIdRefeicaoContratada.Value)) 
                refeicaoContrato.IdRefeicaoContratada = Convert.ToInt64(hfIdRefeicaoContratada.Value);

            return refeicaoContrato;
        }

        #endregion
    }
}